﻿using System;
using System.Collections.Generic;

// Добавили System.Collections;
// (иначе недоступен IEnumerable. Требует IEnumerable<T>)
using System.Collections;
using System.Linq;
using System.Text;

namespace NoteEnumerable
{
	/// <summary>
	/// Класс Дневник
	/// </summary>
	class DayBook: IEnumerable
	{

		public Action<string> Added;
		public Action<string> Deleted;
		string _name;
		public string Name
		{
			get
			{
				return _name;
			}
		}
		/// <summary>
		/// Список записей в дневнике
		/// </summary>
		public List<Note> Notes;
		/// <summary>
		/// Конструктор дневника
		/// </summary>
		public DayBook(string name)
		{
			_name = name;
			// Создадим список записей
			Notes = new List<Note>();
			// Назначим делегат Action на добавление
			Added = AddNote;
			// Назначим делегат Action на удаление
			Deleted = RemoveNote;
		}
		/*
		public DayBook this [int i]
		{
			get
			{
				Notes[i]

				foreach (var n in Notes)
				{					
					if (n.Text == txt)
						return this;
				}

				throw new IndexOutOfRangeException();
			}
		}
		 */

		/// <summary>
		/// Метод Добавить запись в дневник
		/// </summary>
		/// <param name="txt"></param>
		public void AddNote(string txt)
		{
			Note oneNote = new Note(txt);
			Notes.Add(oneNote);
		}

		/// <summary>
		///  Удалить запись из дневника
		/// </summary>
		/// <param name="txt"></param>
		public void RemoveNote(string txt)
		{
			List<Note> noteList = Notes.FindAll(n => n.Text.Equals(txt));
			foreach (Note n in noteList)
			{
				Notes.Remove(n);
			}
		}

		// for class DayBook: IEnumerable
		// using System.Collections;

		/// <summary>
		/// Реализация итератора
		/// </summary>
		/// <returns>Вернёт запись из дневника</returns>
		IEnumerator IEnumerable.GetEnumerator()  //public IEnumerator<Note> GetEnumerator()
		{
			foreach (var data in Notes)
			{
				yield return data;
			}
		}

		/// <summary>
		/// Сортировка по убыванию даты
		/// </summary>
		public class SortDateDesc: IComparer<Note>
		{
			public int Compare(Note n1, Note n2)
			{
				if (n1.Date < n2.Date)
					return 1;

				if (n1.Date > n2.Date)
					return -1;

				else
					return 0;
			}
		}
		/// <summary>
		/// Сортировка по возрастанию даты
		/// </summary>
		public class SortDateAsc : IComparer<Note>
		{
			public int Compare(Note n1, Note n2)
			{
				if (n1.Date > n2.Date)
					return 1;

				if (n1.Date < n2.Date)
					return -1;

				else
					return 0;
			}
		}
	}
}
